#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>


/**
 * @brief 主函数，用于在文件中插入字符串"World"
 *
 * 该程序打开一个名为"file.txt"的文件，并在文件的第4个字节位置插入字符串"World"。
 * 主要步骤包括：打开文件、获取文件状态、扩展文件大小、内存映射文件、插入字符串、同步内存映射和关闭文件。
 *
 * @return 成功返回0，失败返回1
 */
int main() {
    // 打开文件"file.txt"进行读写操作
    int fd = open("file.txt", O_RDWR);
    // 如果文件打开失败，输出错误信息并返回1
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 定义一个stat结构体用于存储文件状态信息
    struct stat st;
    // 获取文件状态信息，如果失败，输出错误信息，关闭文件并返回1
    if (fstat(fd, &st) == -1) {
        perror("fstat");
        close(fd);
        return 1;
    }
    // 获取文件大小
    off_t fileSize = st.st_size;

    // 定义插入位置偏移量
    off_t offset = 3;
    // 扩展文件大小，如果失败，输出错误信息，关闭文件并返回1
    if (ftruncate(fd, fileSize + strlen("World")) == -1) {
        perror("ftruncate");
        close(fd);
        return 1;
    }

    // 将文件映射到内存，如果失败，输出错误信息，关闭文件并返回1
    char *map = mmap(NULL, fileSize + strlen("World"), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (map == MAP_FAILED) {
        perror("mmap");
        close(fd);
        return 1;
    }

    // 将插入位置后的内容向后移动，为插入的字符串腾出空间
    memmove(map + offset + strlen("World"), map + offset, fileSize - offset);
    // 在指定位置插入字符串"World"
    strncpy(map + offset, "World", strlen("World"));

    // 同步内存映射到文件，如果失败，输出错误信息，解除内存映射，关闭文件并返回1
    if (msync(map, fileSize + strlen("World"), MS_SYNC) == -1) {
        perror("msync");
        munmap(map, fileSize + strlen("World"));
        close(fd);
        return 1;
    }

    // 解除内存映射
    munmap(map, fileSize + strlen("World"));
    // 关闭文件
    close(fd);
    // 返回0表示成功
    return 0;
}

